package com.lans.linear;

import java.util.Iterator;

/**
 * @author: lans
 * @date: 2025/2/18
 * @name: 刘宇
 */
//对数据进行查询 删除 等操作
public class LinkList <T> implements Iterable<T>{

    //记录头节点
    private Node head;

    //记录链表的长度
    private int N;

    public LinkList(){
        head = new Node(null,null);
        N= 0 ;
    }

    @Override
    public Iterator<T> iterator() {
        return null;
    }

    private class LIterator implements Iterator<T>{

        @Override
        public boolean hasNext() {
            return false;
        }

        @Override
        public T next() {
            return null;
        }
    }


    private class Node{
        //存储的T类型元素
        public T item;
        //下一个节点
        public Node next;
        public Node(T item,Node next){
            this.item = item;
            this.next = next;
        }
    }
    //清空线性表元素
    public void clear(){
        head.next = null;
        N=0;
    }

    //判断是否为空
    public boolean isEmpty(){
        return N==0;
    }

    //线性表长度
    public int length(){
        return N;
    }

    //读取并返回线性表中的第i个元素
    public T get(int i){
            if(i<0||i>N){
                throw new RuntimeException("索引不合法");
            }

            Node n = head.next;
            for(int index=0;index<i;index++){
                n = n.next;
            }
            return n.item;
        }

    //向线性表中添加一个一个元素
    public void  insert(T i){
        //找最后一个元素
        Node n = head;
        while(n.next!=null){
            n = n.next;
        }
        Node node = new Node(i,null);
        n.next = node;
        N++;
    }

    //向指定位置i处，添加元素t
    public void insert(int i,T t){
        //创建新节点
        Node newNode = new Node(t, null);
        if(i<0||i>=N){
            throw new RuntimeException("位置不合法");
        }
        //特殊情况 i==0
        if(i==0){
            newNode.next = head.next;
            head = newNode;
            N++;
            return ;
        }
        //找到要插入新节点之前的那个节点
        Node current = head;
        for(int index = 0;index<=i-1;index++){
            current = current.next;
        }//0123456  3
        newNode.next = current.next;
        current.next = newNode;
        N++;
    }

    //删除并返回线性表中的第i个元素
    public T remove(int i){
        if(i<0||i>N){
            throw new RuntimeException("位置不合法");
        }
        Node n = head;
        for(int index = 0;index<=i-1;i++){
            n = n.next;
        }
        Node current = n.next;
        //该节点的前一个节点指向后一个节点
        n.next = current.next;
        N--;
        return current.item;
    }

    //返回线性表中首次出现的指定的数据元素的为序号 若不存在则返回-1
    public int indexOf(T t){
        Node node = head;
        for(int index = 0;index<N-1;index++){
            node = node.next;
            if(node.item.equals(t)){
                return index;
            }
        }
        return -1;
    }
}